package hotel.mensagens;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import o2b.IStream;
import o2b.MarshallableException;
import hotel.tipos.Registro;
import hotel.tipos.Reserva;

public class ManterRegistro extends Mensagem {

	protected Registro registro;
	/**
	 *  1 - cadastrar Registro;
	 *   11 - resposta cadastrar Registro OK
	 *   12 - resposta cadastrar Registro NOK
	 *   13 - resposta cadastrar checkim APTO OCUPADO
	 *	2 - procurar Registro;
	 *   21 - resposta procurar Registro 
	 *   22 - resposta procurar Registro NOK
	 *	3 - alterar Registro ; 
	 *	 31 - resposta alterar Registro
	 *	 32	- resposta alterar Registro NOK
	 *	4 - apagar Registro;
	 *	 41 - resposta apagar Registro
	 *	 42 - resposta apagar Registro NOK
	 * 5 - confirmar reserva
	 *  51 - resposta confirmar reserva OK
	 *  52 - resposta confirmar reserva NOK
	 *  
	**/
	private int tipoManterRegistro; 
	private String nomeDoHospede;
	
	/**
	 * Construtor padrão
	 */
	public ManterRegistro() {
		tipo = TipoMensagem.MANTERREGISTRO;
		setRegistro(new Registro());
	}
	
	public ManterRegistro(int tipoManterRegistro) {
		tipo = TipoMensagem.MANTERREGISTRO;
		setRegistro(new Registro());
		setTipoManterRegistro(tipoManterRegistro);
	}
	
	@Override
	/**
	 * Envia os dados da Registro
	 * @param stream stream com os dados a serem enviados
	 */
	public void marshal(IStream stream) throws MarshallableException {
		super.marshal(stream); 								// Envia o tipo da mensagem
		stream.write(getTipoManterRegistro());				// Envia o subtipo da mensagem
		switch(getTipoManterRegistro()){
		case 1:
			stream.write(getNomeDoHospede());							// Envia o nome do hospede da Registro
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");	// Cria um formatador de data
			String dtIni = sdf.format(getRegistro().getDataInicio());	// Transforma a data de início em string
			stream.write(dtIni);										// Envia a data de início
			String dtFim = sdf.format(getRegistro().getDataFim());		// Transforma a data de saída em string
			stream.write(dtFim);										// Envia a data da saída
			break;
			
		case 2:
			break;
			
		case 3:
			break;
		}
	}
	
	@Override
	public void unmarshal(IStream stream) throws MarshallableException {
		// Extrai o tipo da mensagem
		//super.unmarshal(stream);
		
		// extrai o subtipo da mensagem
		setTipoManterRegistro(stream.readInt());
		
		// Trata o subtipo da mensagem
		switch(getTipoManterRegistro()){
		
			// Mensagem do tipo cadastrar Registro
			case 1:
			
				// Extrai o nome do hospede da Registro
				this.setNomeDoHospede((String) stream.readObject());
			
				// Cria um formato de data
				SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
				
				try {
					// Le e seta a data de início
					getRegistro().setDataInicio(df.parse((String) stream.readObject()));
					// Se e seta a data de saída
					getRegistro().setDataFim(df.parse((String) stream.readObject()));
				} catch (ParseException e) {
					e.printStackTrace();
				}
				
				break;
				
			case 2:
				break;
				
			case 3:
				break;
				
			default:
				break;
		}
	}

	public Registro getRegistro() {
		return registro;
	}

	public void setRegistro(Registro registro) {
		this.registro = registro;
	}

	public void setNomeDoHospede(String nomeDoHospede) {
		this.nomeDoHospede = nomeDoHospede;
	}

	public String getNomeDoHospede() {
		return nomeDoHospede;
	}

	public int getTipoManterRegistro() {
		return tipoManterRegistro;
	}

	public void setTipoManterRegistro(int tipoManterRegistro) {
		this.tipoManterRegistro = tipoManterRegistro;
	}
}
